/**
 * 
 */
package com.feib.stms.dao.jdbc;


import java.sql.Types;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.springframework.jdbc.support.incrementer.OracleSequenceMaxValueIncrementer;
import org.springframework.stereotype.Repository;

import com.feib.stms.dao.UserLoginHistoryDao;
import com.feib.stms.dao.jdbc.rowmapper.UserLoginHistoryRowMapper;
import com.feib.stms.model.User;
import com.feib.stms.model.UserLoginHistory;
import com.feib.stms.pagination.PaginatedList;

/**
 * @author Jimmy Liu
 *
 */
@Repository("userLoginHistoryDao")
public class UserLoginHistoryJdbcDao extends BaseJdbcDao implements UserLoginHistoryDao 
{
	private OracleSequenceMaxValueIncrementer sequence;
	
	private SimpleJdbcInsert userLoginControlJdbcInsert;
	
	@Override
	protected void initDao() throws Exception {
		super.initDao();
		this.sequence = new  OracleSequenceMaxValueIncrementer(this.getDataSource(), "USER_LOGIN_HISTORY_PK_SEQ");
		this.userLoginControlJdbcInsert = new  SimpleJdbcInsert(this.getDataSource());
		this.userLoginControlJdbcInsert.withTableName("USER_LOGIN_HISTORY")
			.usingColumns("USER_LOGIN_HISTORY_PK", "USER_PK", "GROUP_NO", "USER_ID", "USER_PWD"
					, "CAPTCHA", "SESSION_ID", "LOGIN_TIME", "LOGIN_LOCALE_IP", "IS_SUCCEED", "FAILEDNOTE");
		
	}
	
	
	public int insert(UserLoginHistory userLoginHistory) {	

		MapSqlParameterSource parameters = new MapSqlParameterSource();
		
		Long userLoginHistoryPk = new Long(sequence.nextLongValue());
		parameters.addValue("USER_LOGIN_HISTORY_PK", userLoginHistoryPk, Types.NUMERIC);
		parameters.addValue("USER_PK",  userLoginHistory.getUser().getUserPk(), Types.NUMERIC);
		parameters.addValue("USER_ID",  userLoginHistory.getUser().getUserId(), Types.VARCHAR);
		parameters.addValue("GROUP_NO",  userLoginHistory.getUser().getGroup().getGroupNo(), Types.VARCHAR);
		parameters.addValue("USER_PWD",  userLoginHistory.getUserPwd(), Types.VARCHAR);
		
		parameters.addValue("CAPTCHA",  userLoginHistory.getCaptch(), Types.VARCHAR);
		parameters.addValue("SESSION_ID",  userLoginHistory.getSessionId(), Types.VARCHAR);
		parameters.addValue("LOGIN_TIME",  userLoginHistory.getLoginTime(), Types.TIMESTAMP);		
		parameters.addValue("LOGIN_LOCALE_IP",  userLoginHistory.getLoginLocaleIP(), Types.VARCHAR);
		parameters.addValue("IS_SUCCEED", convertToInteger(userLoginHistory.getSucceed()), Types.NUMERIC);
		parameters.addValue("FAILEDNOTE", userLoginHistory.getFailedNote(), Types.VARCHAR);
		
	
		int updateCounts = userLoginControlJdbcInsert.execute(parameters);		

		if (updateCounts > 0)
			userLoginHistory.setUserLoginHistoryPk(userLoginHistoryPk);
		
		return updateCounts;
	}
	
	
	public PaginatedList<UserLoginHistory> queryForPaginatedListByUserLoginHistory(UserLoginHistory userLoginHistory, PaginatedList paginatedList) 
	{
		SqlQueryProvider sqlQueryProvider = getSqlQueryProviderByUserLoginHistory(userLoginHistory, paginatedList);
		
		return this.queryForPaginatedList(sqlQueryProvider, new UserLoginHistoryRowMapper(), paginatedList.getPageNumber(), paginatedList.getPageSize());
	}
	
	
	protected SqlQueryProvider getSqlQueryProviderByUserLoginHistory(UserLoginHistory userLoginHistory, PaginatedList paginatedList)
	{
		/* 查詢 SQL */
		StringBuffer sql = new StringBuffer();
		
		/* 查詢條件 */
		List<Object> args = new ArrayList<Object>();
		
		sql.append("select * from USER_LOGIN_HISTORY where 1=1");
		if (null != userLoginHistory)
		{
			User user = userLoginHistory.getUser();
			if (null != user)
			{
				/* 若有主鍵，則只用主鍵查詢 */
				if (null != user.getUserPk())
				{
					sql.append(" AND USER_PK = ? ");
					args.add(user.getUserPk());
				}
				else
				{
					/* 否則使用帳號與群組代號查詢  */
					if (StringUtils.isNotEmpty(user.getUserId()))
					{
						sql.append(" AND USER_ID like ? ");
						args.add(user.getUserId() + "%");
					}
					
					if (null != user.getGroup() && StringUtils.isNotEmpty(user.getGroup().getGroupNo()))
					{
						sql.append(" AND GROUP_NO like ? ");
						args.add(user.getGroup().getGroupNo()+ "%");
					}
					
				}
				
			}
			
			/* sessionId 查詢 */
			if (StringUtils.isNotEmpty(userLoginHistory.getSessionId()))
			{
				sql.append(" AND SESSION_ID =  ");
				args.add(userLoginHistory.getSessionId());
			}
			
		}
		
		if (null != paginatedList)
		{
			if (StringUtils.isNotEmpty(paginatedList.getSortCriterion()))
			{
				sql.append(" ORDER BY ").append(paginatedList.getSortCriterion()).append(" ").append( 2==paginatedList.getSortDirection() ? "ASC" : "DESC" );
			}			
		}
		
		SqlQueryProvider sqlQueryProvider = new SqlQueryProvider(sql.toString(), args);
		return sqlQueryProvider;
	}

}
